1153D - Serval and Rooted Tree - CodeForces Solution


binary search dfs and similar dp greedy trees *1900

Please click on ads to support us..

C++ Code:

//dp[i]:if Max v is w, then need w + dp[i]
#include <iostream>
#include <cstring>

using namespace std;

const int N = 3e5 + 10; 

int n, leaf;
int fa[N], dp[N], m[N];
int h[N], e[N], ne[N], idx;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int x) {
	for (int i = h[x]; ~i; i = ne[i]) {
		int j = e[i];
		dfs(j);
	}
	if (h[x] == -1) dp[x] = 0, leaf ++;
	else {
		if (m[x]) {
			dp[x] = 998244353;
			for (int i = h[x]; ~i; i = ne[i]) dp[x] = min(dp[x], dp[e[i]]);
		}
		else {
			for (int i = h[x]; ~i; i = ne[i]) dp[x] += dp[e[i]] + 1;
			dp[x] --;
		}
	}
}

int main() {
	memset(h, -1, sizeof h);
	
	scanf("%d", &n);
	
	for (int i = 1; i <= n; i ++) scanf("%d", &m[i]);
	
	for (int i = 2; i <= n; i ++) {
		scanf("%d", &fa[i]);
		add(fa[i], i);
	}
	
	dfs(1);
	
	printf("%d", leaf - dp[1]);
	
	return 0;
}
	   		  	  	   	 	  		  						


Comments

Submit
0 Comments
More Questions

236A - Boy or Girl
271A - Beautiful Year
520B - Two Buttons
231A - Team
479C - Exams
1030A - In Search of an Easy Problem
158A - Next Round
71A - Way Too Long Words
160A - Twins
1A - Theatre Square
1614B - Divan and a New Project
791A - Bear and Big Brother
1452A - Robot Program
344A - Magnets
96A - Football
702B - Powers of Two
1036A - Function Height
443A - Anton and Letters
1478B - Nezzar and Lucky Number
228A - Is your horseshoe on the other hoof
122A - Lucky Division
1611C - Polycarp Recovers the Permutation
432A - Choosing Teams
758A - Holiday Of Equality
1650C - Weight of the System of Nested Segments
1097A - Gennady and a Card Game
248A - Cupboards
1641A - Great Sequence
1537A - Arithmetic Array
1370A - Maximum GCD